﻿Public Class TMyCollations
    Implements System.IDisposable

    Private _List As New List(Of TMyCollation)
    Private myQuery As New TMyQuery
    Private _DefaultCharSet As String
    Private _DefaultCollation As String

    Public Sub New(ByVal AConnection As TMySession)
        myQuery.Session = AConnection
        Init()
    End Sub

    Public Function GetCharacterSetName(ByVal ACollation As String) As String
        For Each item As TMyCollation In _List
            If item.CollationName.Equals(ACollation) Then
                Return item.CharacterSetName
            End If
        Next
        Return String.Empty
    End Function
    Public ReadOnly Property Count() As Integer
        Get
            Return _List.Count
        End Get
    End Property
    Default Public ReadOnly Property Items(ByVal Index As Integer) As TMyCollation
        Get
            Return _List(Index)
        End Get
    End Property
    Private Sub SetDefaultCharset()
        myQuery.Clear()
        myQuery.SQL.Append("show global variables like 'character_set_database'")
        myQuery.Execute()
        If Not myQuery.Eof Then
            _DefaultCharSet = myQuery.FieldAsString("value")
        End If
        myQuery.Close()
    End Sub
    Private Sub SetDefaultCollation()
        myQuery.Clear()
        myQuery.SQL.Append("show global variables like 'collation_database'")
        myQuery.Execute()
        If Not myQuery.Eof Then
            _DefaultCollation = myQuery.FieldAsString("value")
        End If
        myQuery.Close()
    End Sub
    Private Sub Init()
        _List.Clear()
        SetDefaultCharSet()
        SetDefaultCollation()
        myQuery.Clear()
        myQuery.SQL.AppendLine("select")
        myQuery.SQL.AppendLine(" COLLATION_NAME")
        myQuery.SQL.AppendLine(",CHARACTER_SET_NAME")
        myQuery.SQL.AppendLine(",ID")
        myQuery.SQL.AppendLine(",IS_DEFAULT")
        myQuery.SQL.AppendLine(",IS_COMPILED")
        myQuery.SQL.AppendLine(",SORTLEN")
        myQuery.SQL.AppendLine("from")
        myQuery.SQL.AppendLine(" information_schema.collations")
        myQuery.SQL.AppendLine("order by")
        myQuery.SQL.AppendLine(" COLLATION_NAME")
        myQuery.Execute()
        While Not myQuery.Eof
            Dim item As New TMyCollation
            item._CollationName = myQuery.FieldAsString("collation_name")
            item._DefaultCollation = item._CollationName.Equals(_DefaultCollation)
            item._CharacterSetName = myQuery.FieldAsString("character_set_name")
            item._ID = myQuery.FieldAsInteger("id")
            item._IsDefault = myQuery.FieldAsString("is_default")
            item._IsCompiled = myQuery.FieldAsString("is_compiled")
            item._Sortlen = myQuery.FieldAsInteger("sort_len")
            _List.Add(item)
            myQuery.MoveNext()
        End While
        myQuery.Close()
    End Sub

    Private disposedValue As Boolean = False        ' 重複する呼び出しを検出するには

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: 他の状態を解放します (マネージ オブジェクト)。
            End If
            myQuery.Close()
            myQuery.Dispose()
            ' TODO: ユーザー独自の状態を解放します (アンマネージ オブジェクト)。
            ' TODO: 大きなフィールドを null に設定します。
        End If
        Me.disposedValue = True
    End Sub

#Region " IDisposable Support "
    ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
    Public Sub Dispose() Implements IDisposable.Dispose
        ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

End Class
